#include <stdio.h>
#include <string.h>
#include <mysql/mysql.h>

#define HOST "127.0.0.1"
#define USER "root"
#define PASSWD ""
#define DBNAME "test_db"
#define PORT 3306

int main()
{
    // 1. 初始化mysql句柄
    // MYSQL *mysql_init(MYSQL *mysql);
    MYSQL *mysql = mysql_init(NULL);
    if (NULL == mysql)
    {
        perror("mysql_init failed");
        exit(1);
    }

    // 2. 连接mysql服务器
    // MYSQL *mysql_real_connect(mysql, host, user, pass, dbname, port, unix_socket, flag);
    if (NULL == mysql_real_connect(mysql, HOST, USER, PASSWD, DBNAME, PORT, NULL, 0))
    {
        printf("mysql_real_connect failed: %s\n", mysql_errno(mysql));
        exit(2);
    }

    // 3. 设置客户端字符集
    // int mysql_set_character_set(mysql, "utf8");
    if (0 != mysql_set_character_set(mysql, "utf8"))
    {
        printf("mysql_set_character_set failed: %s\n", mysql_errno(mysql));
        mysql_close(mysql);
        exit(3);
    }

    // 4. 选择要操作的数据库(这一步有点鸡肋，什么连接时已经有绑定了)
    // int mysql_select_db(mysql, dbname)
    // mysql_select_db(mysql, DBNAME);

    // 5. 执行sql语句
    // int mysql_query(MYSQL *mysql,  char *sql);
    char *sql = "select * from stu";
    int ret = mysql_query(mysql, sql);
    if (0 != ret)
    {
        printf("%s\n", sql);
        printf("mysql_query failed: %s\n", mysql_errno(mysql));
        mysql_close(mysql);     // 防止内存泄漏
        exit(5);
    }

    // 6. 如果sql语句是查询语句，则需要保存结果到本地
    // MYSQL_RES *mysql_store_result(MYSQL *mysql)
    MYSQL_RES *res = mysql_store_result(mysql);
    if (NULL == res)
    {
        perror("mysql_store_result failed");
        mysql_close(mysql);     // 防止内存泄漏
        exit(5);
    }

    // 7. 获取结果集中的结果条数
    // int mysql_num_rows(MYSQL_RES *res);
    // int mysql_num_fields(MYSQL_RES *res);
    int numRow = mysql_num_rows(res);
    int numCol = mysql_num_fields(res);

    // 8. 遍历保存到本地的结果集
    for (int i = 0; i < numRow; i++)
    {
        // MYSQL_ROW mysql_fetch_row(MYSQL *res);
        // 返回值：实际上是⼀个char **的指针，将每⼀条数据做成了字符串指针数组
        // row[0]-第0列 row[1]-第1列
        MYSQL_ROW row = mysql_fetch_row(res);     // 返回的row是一个char*数组，每个char*就是当前这行的各个字段值
        for (int j = 0; j < numCol; j++)
            printf("%s\t", row[j]);
        printf("\n");
    }

    // 9. 释放结果集
    mysql_free_result(res);

    // 10. 关闭连接，释放句柄
    mysql_close(mysql);

    return 0;
}